/**
 * 统一错误处理工具
 * 用于从各种错误对象中提取用户友好的错误消息
 */

export interface ApiError {
  code?: number
  message?: string
  msg?: string
  details?: unknown
}

/**
 * 从错误对象中提取用户友好的错误消息
 * @param error 错误对象
 * @param defaultMessage 默认错误消息
 * @returns 用户友好的错误消息
 */
export function extractErrorMessage(error: unknown, defaultMessage = '操作失败'): string {
  if (!error) {
    return defaultMessage
  }

  // 如果是字符串，直接返回
  if (typeof error === 'string') {
    return error
  }

  // 如果是Error对象
  if (error instanceof Error) {
    return error.message || defaultMessage
  }

  // 如果是普通对象
  if (error && typeof error === 'object') {
    const errorObj = error as Record<string, unknown>
    
    // 优先使用后端返回的错误消息
    if (errorObj.msg && typeof errorObj.msg === 'string') {
      return errorObj.msg
    }
    
    if (errorObj.message && typeof errorObj.message === 'string') {
      return errorObj.message
    }
    
    // 检查是否有嵌套的错误信息
    if (errorObj.response && typeof errorObj.response === 'object') {
      const response = errorObj.response as Record<string, unknown>
      if (response.data && typeof response.data === 'object') {
        const data = response.data as Record<string, unknown>
        if (data.msg && typeof data.msg === 'string') {
          return data.msg
        }
        if (data.message && typeof data.message === 'string') {
          return data.message
        }
      }
    }
  }

  return defaultMessage
}

/**
 * 检查错误是否为网络错误
 * @param error 错误对象
 * @returns 是否为网络错误
 */
export function isNetworkError(error: unknown): boolean {
  if (error && typeof error === 'object') {
    const errorObj = error as Record<string, unknown>
    return errorObj.code === 0 || (typeof errorObj.message === 'string' && errorObj.message.includes('网络连接失败'))
  }
  return false
}

/**
 * 检查错误是否为认证错误
 * @param error 错误对象
 * @returns 是否为认证错误
 */
export function isAuthError(error: unknown): boolean {
  if (error && typeof error === 'object') {
    const errorObj = error as Record<string, unknown>
    return errorObj.code === 401 || 
           (typeof errorObj.message === 'string' && (errorObj.message.includes('未授权') || errorObj.message.includes('Token无效')))
  }
  return false
}

/**
 * 格式化错误消息，添加适当的提示
 * @param error 错误对象
 * @param context 操作上下文
 * @returns 格式化的错误消息
 */
export function formatErrorMessage(error: unknown, context = ''): string {
  const message = extractErrorMessage(error)
  
  if (context) {
    return `${context}: ${message}`
  }
  
  return message
}
